#     Xepec.ru - социальная сеть
#     Copyright (C) 2008  Fedorchenko Alexander <admin@xepec.ru>
#
#     This program is free software: you can redistribute it and/or modify
#     it under the terms of the GNU Affero General Public License as
#     published by the Free Software Foundation, either version 3 of the
#     License, or (at your option) any later version.
#
#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU Affero General Public License for more details.
#
#     You should have received a copy of the GNU Affero General Public License
#     along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#     Autor: Fedorchenko Alexander
#     Mail: <admin@xepec.ru>
#     Date: 06/02/2010
#
#
#TODO: Разабраться с инклудами для core.php и config.php
#TODO: Сделать кактинки в сообщениях как на http://www.artlebedev.ru/tools/technogrette/html/picture_fragmentation/
#TODO: Фильтровать доступ к запросам запретить "кавычки" и ;

$debug = FALSE;
#print $ENV{"DOCUMENT_ROOT"};
require "$ENV{'DOCUMENT_ROOT'}/config.pl";

use CGI::Cookie;
%cookies = fetch CGI::Cookie;
# use Time::HiRes qw(gettimeofday);
# $start_time = gettimeofday;

sub log_write
{
	#require "./config.pl";
	open(FILE, ">> $ENV{'DOCUMENT_ROOT'}/xepec.log") or die "Couldn't open xepec.log for writing: $_[0](error #1)\n";
	print FILE "$_[0]";
	close(FILE);
	return 1;
}

sub date_iso8601
{
	use strict;
	use POSIX qw(strftime);
	
	my $now = time();
	my $tz = strftime("%z", localtime($now));
	$tz =~ s/(\d{2})(\d{2})/$1:$2/;
	return strftime("%Y-%m-%dT%H:%M:%S", localtime($now)) . $tz;
}

sub set_cookie
{
	use CGI::Cookie;
	use CGI qw/:standard/;
	
	foreach $cookie (@_)
	{
		( $name, $value, $time ) = split( / /, $cookie );
		$cookie1 = new CGI::Cookie(-name=>$name, -value=>$value, -expires=>$time)."\n";
		print "Set-Cookie: ".$cookie1;
	}
}

sub str_replace # ("что","чем",$где)
{
	my $replace_this = shift;
	my $with_this  = shift; 
	my $string   = shift;
	
	my $length = length($string);
	my $target = length($replace_this);
	
	for(my $i=0; $i<$length - $target + 1; $i++) {
		if(substr($string,$i,$target) eq $replace_this) {
			$string = substr($string,0,$i) . $with_this . substr($string,$i+$target);
			return $string;
		}
	}
	return $string;
}

sub get_query {
  %queryString = ();
  my $tmpStr = $ENV{ "QUERY_STRING" };
  @parts = split( /\&/, $tmpStr );
  foreach $part (@parts) {
    ( $name, $value ) = split( /\=/, $part );
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$value =~ s/'//g;
    $queryString{ "$name" } = $value;
  }
}
#&get_query;
#print $queryString{ "n" };
#print "\n".$queryString{ "ds" };

sub uname_get # Получение массива инфы о юсере
{
	#my $uname_get = shift;
	#  0      1                                                            2      3                     4                 5        6                      7                                                                            8          9                    10                   11           12                                          13                                                            14           15                                                             16         17
	#+----+------------------------------------------------------------+------+---------------+------------------------+------+---------------------+---------------------------------------------------------------------------+-----------+---------------------+---------------------+--------+---------------------------------------------+-------------------------------------------------------------+------------+-----------------------------------------------------------------+---------+------+
	#| id | name                                                       | foto | nic           | email                  | sex  | bday                | phone                                                                     | im        | time                | last_time           | pepyka | about                                       | status                                                      | interes    | citata                                                          | groups  | age  |
	#+----+------------------------------------------------------------+------+---------------+------------------------+------+---------------------+---------------------------------------------------------------------------+-----------+---------------------+---------------------+--------+---------------------------------------------+-------------------------------------------------------------+------------+-----------------------------------------------------------------+---------+------+


	$ath = $dbcnx->prepare(qq{SELECT *,(YEAR(CURRENT_DATE) - YEAR(bday)) - (RIGHT(CURRENT_DATE,5)<RIGHT(bday,14)) AS age FROM username WHERE id =?}) or die('(error #2)');
	$ath->execute($_[0]);
	@results = $ath->fetchrow_array();
	$ath->finish();
	$dbcnx->disconnect();
	return @results;
}

sub get_nic # Получение nic юсерa
{
	my $nic = $dbcnx->selectrow_array(qq{select nic FROM username WHERE id = '$_[0]'}) or return "DELITED";
	$dbcnx->disconnect();
	return $nic;
}

sub get_email # Получение email юсерa
{
	my $mail = $dbcnx->selectrow_array(qq{select email FROM username WHERE id = '$_[0]'}) or return "DELITED";
	$dbcnx->disconnect();
	return $mail;
}

sub do_auth
{
	
	#my $nic = shift;
	#my $pass = shift;
	$date = date_iso8601();
	
	$ath = $dbcnx->prepare(qq{SELECT id FROM reg WHERE name=? and md5 = ?});
	$ath->execute($_[0],$_[1]);
	$numrows = $ath->rows;
	if ($numrows == 1)
	{
		$uname_auth = $ath->fetchrow_array();

		$ath = $dbcnx->prepare(qq{UPDATE username SET last_time=(SELECT NOW()) WHERE id=?});
		$ath->execute($uname_auth);
		$ath->finish();
		$dbcnx->disconnect();
		
#		set_cookie("xepec_nic",$nic, time()+10000);
#		set_cookie("xepec_pass", $pass, time()+10000);
		
		log_write("$date: На сайт зашел пользователь '$_[0]' (IP: ".$ENV{'REMOTE_ADDR'}.", Agent: ".$ENV{'HTTP_USER_AGENT'}.")\n");
		
		return $uname_auth;
	}
	else
	{
		$ath->finish();
		$dbcnx->disconnect();
		return 0;
	}
}

sub do_check # Функция проверки прав на страницу возвращяет id юсера который запрашивал, если нет или неправельно то false
{
	
#	require "config.pl";
	$date = date_iso8601();
	if(!defined($ENV{'HTTP_COOKIE'}))
	{
		return 0;
	}
	my $nic = $cookies{'xepec_nic'}->value;
	my $pass = $cookies{'xepec_pass'}->value;
	
	if (!$pass or !$nic)
	{
		die('error #3');
		return 0;
	}
	#$date_reg = $date = date_iso8601();
	
	$ath = $dbcnx->prepare(qq{SELECT id FROM reg WHERE name=? and md5=?});
	$ath->execute($nic,$pass);
	if (!$ath)  {die("db error (error #4)");}# return false;}
	my $uname_id = $ath->fetchrow_array();
	#my $uname_id = $results[0];
	my $numrows = $ath->rows();
	if ($numrows != 1)
	{
		#if (!$ath) {die('error #5')};
		$ath->finish();
		$dbcnx->disconnect();
		set_cookie("xepec_nic", 0);
		set_cookie("xepec_pass", 0);
		return 0;
		
	}
	else
	{	
		$ath = $dbcnx->prepare(qq{UPDATE username SET last_time=(SELECT NOW()) WHERE id=?});
		$ath->execute($uname_id);
		$ath->finish();
		$dbcnx->disconnect();
		
		log_write(qq{$date: Пользователю '$nic' доступна страница $ENV{'SCRIPT_NAME'}?$ENV{QUERY_STRING}  (IP: $ENV{'REMOTE_ADDR'}, Agent: $ENV{'HTTP_USER_AGENT'})\n});
		return $uname_id;
	}
	
}

sub resizeimg
{
	#FIXME Протестировать с вертикальными картинками с учетом пропорций 3/4 или 4/3 или другая

	use GD;
	
	my $myImage = shift;
	my $ImageLocation = shift;
	my $h = shift;
	
	my $srcImage = GD::Image->trueColor(1);
	my $srcImage = new GD::Image($myImage);
	my @size= $srcImage->getBounds;
	my $propor = $size[0] / $size[1];
	my $height = $h;
	my $width= $h*$propor;
	if ($size[1]<$height) {return 0};
	my $destImage = new GD::Image($width,$height);
	$destImage->copyResized($srcImage,0,0,0,0,$width,$height,$size[0],$size[1]);
	
	#my $ImageLocation = "./11.jpg";
	
	open IMG,">$ImageLocation" or die "$ImageLocation $!(error #6)";
		binmode IMG;
		#print IMG $destImage->png("7");
		print IMG $destImage->jpeg("70");
	close IMG;
	
	return 1;
}

sub pepyka_count
{
	use Switch;
	
	$id = shift;
	@reg_data = uname_get($id);   	
	
	$pepyka = 10;#Стартовое значение для пепяки
	$i = 0;
	while($i<16)
	{
		#print $reg_data[$i].",";
		#отдельно рассматривать случаи
		if($i == 7)# Рассмотрим телефоны
		{
			@phone = split (/,/,$reg_data[7]);
			foreach (@phone)
			{
				@phone_item = split (/:/,$_);
				$phone_type = shift @phone_item;# Выбираем из массива только название типа телефона
				$phone_numder = shift @phone_item;# Выбираем из массива только оставшиеся элемент, то есть цифры номера
				# Далее начисляем пепяку для каждого типа, если он указан
				switch ($phone_type)
				{
					case "phone_mob"
					{
						$pepyka = $pepyka +20 if($phone_numder);
					}
					case "phone_home"
					{
						$pepyka = $pepyka +10 if($phone_numder);
					}
					case "phone_work"
					{
						$pepyka = $pepyka +5 if($phone_numder);
					}
					case "phone_other"
					{
						$pepyka = $pepyka +5 if($phone_numder);
					}
				}
			}
		}
			elsif (($i == 6) and ($reg_data[6] eq "--T00:00:00+00:00"))#Если дата рождения не указанна
			{
				 # При этом условие ничего не делать
				}
				# Из-за того, что указание пароля в ходит в стартовую(50) пепяку! Ложно считаем id пользователя, т.к. id такойже обязательный атрибут как и пароль!
				# Этим мы экономим один SQL запрос при подсчете
				elsif(($i == 2) or ($i == 9) or ($i == 10) or ($i == 11) or ($i == 16)) #Исклычить начисление пепяки за дату регистрации и последнее посешение, т.к. они не равны нулю
				{
				# При этих типах значений ничего не делать
				$pepyka = $pepyka;
					}
					elsif($reg_data[$i])# Если значение заданно(остальсь только указанные в форме)
					{
					$pepyka = $pepyka +10; #Если пользователь не ввел инфу то шыш
					}
		$i++;
	}
	if($reg_data[2] == 1){$pepyka = $pepyka +100;}# +100 если есть фотка
	#$pepyka = $pepyka + @reg_data;

	$reg_data[11] = $pepyka;
	
	#min = 50;
	#max = 250;
	return $pepyka;
}

# sub do_update_uname
# # TEST
# {
# 	#TODO добавить возможность смены пароля
# 	#TODO разобраться с запросами в которых select id и возврашяется массив
# 	#	$re = $dbcnx->prepare("SELECT id FROM reg WHERE name = '$nic_cook' and md5 = '$pass_cook'");
# 	#	@results = $re->fetchrow_array();
# 	#	$uname_auth = $results[0];
# 	
# #	require "config.pl";
# # 		$uname = mysql_fetch_array($ath);
# # 		$name = $uname['name'];
# # 		$mail = $uname['email'];
# # 	
# 		
# # 		$bdate = $uname['bday'];
# # 		$phone = $uname['phone'];
# # 		$icq = $uname['iсq'];
# # 		$about = $uname['about'];
# # 		$interes = $uname['interes'];
# # 		$citata = $uname['citata'];
# 	my $name = shift;
# 	my $nic = shift;
# 	my $mail = shift;
# 	my $sex = shift;
# 	my $bday = shift;
# 	my $phone = shift;
# 	my $icq = shift;
# 	my $photo = shift;
# 	my $about = shift;
# 	my $interes = shift;
# 	my $citata = shift;
# 	
# 	     $mail = str_replace('=', '.', $mail);
# 	     $pass = str_replace('=', '.', $pass);
# 	
# 	     $mail = str_replace(';', '.', $mail);
# 	     $pass = str_replace(';', '.', $pass);
# 	
# 	     $mail = str_replace('-', '_', $mail);
# 	     $pass = str_replace('-', '_', $pass);
# 	
# 	$nic_cook = $cookies{'xepec_nic'}->value;
# 	$pass_cook = $cookies{'xepec_pass'}->value;
# 	$pass = $pass_cook;
# 	#############################################
# 	############################################ важно TEST экранирование
# 	$vcard="<vCard xmlns=\'vcard-temp\'><FN>$name</FN><N><FAMILY>$name</FAMILY></N><NICKNAME>$nic</NICKNAME><EMAIL>$mail</EMAIL><URL>$icq</URL><BDAY>$bdate</BDAY><DESC>$about</DESC></vCard>";
# 	$date = date_iso8601();
# 		
# 		#print "name = ".$nic_cook.", pass = ".$pass_cook.", id = ".$id_cook;
# 		
# 	$re = $dbcnx->prepare(qq{SELECT id FROM reg WHERE name=? and md5=?});
# 	$re->execute($nic_cook,$pass_cook);
# 	$numrows = $re->rows;
# 	if ($numrows == 1)
# 	{
# 		if (!$re)  {die("db error (error #7)");}# return false;}
# 		$results = $re->fetchrow_array();
# 		$uname_auth = $results;
# 		print "<br>".$uname_auth;
# 			$ath = $dbcnx->prepare(qq{SELECT * from username WHERE id='$uname_auth'});
# 			if(!$ath){die("db error (error #8)");return FALSE;}
# 			else
# 			{
# 				@uname_old = $ath->fetchrow_array();
# 				#Возможно здесь нужен execute()
# 				$uname_old_nic=@uname_old[3];
# 				# ---0------------------------------1----------------------------------2---------3--------4-------------5--------6-------------------7--------------8-------------9-------------------10--------------------11------12--------------13----------------14-------15--------16----
# 				# +----+------------------------------------------------------------+--------+------+---------------+------+---------------------+--------------+-----------+---------------------+---------------------+--------+-------+------------------------+---------+--------+--------+
# 				# | id | name                                                       | passw  | nic  | email         | sex  | bday                | phone        | icq       | time                | last_time           | pepyka | about | status                 | interes | citata | groups |
# 				# +----+------------------------------------------------------------+--------+------+---------------+------+---------------------+--------------+-----------+---------------------+---------------------+--------+-------+------------------------+---------+--------+--------+
# 				# |  1 | Федорченко Александр Андреевич                             |        | sos  | sos20@******* |    1 | 19**-**-** 00:00:00 | ************ | ********* | 2008-12-15 00:00:00 | 2009-09-23 23:08:48 |      0 |       | Делаю сайт...          |         |        | 0      |
# 				# +----+------------------------------------------------------------+--------+------+---------------+------+---------------------+--------------+-----------+---------------------+---------------------+--------+-------+------------------------+---------+--------+--------+
# 				
# 				#В версии 0.1 пределана структура сайта поэтому убранн колонка photo из БД и заменена статичной картинкой(см. theme.pl || theme.php )
# 				
# 				if ((@uname_old[1] != $name) || (@uname_old[2] != $pass) || (@uname_old[3] != $nic) || (@uname_old[4] != $mail) || (@uname_old[5] != $sex) || (@uname_old[6] != $bday) || (@uname_old[7] != $phone) || (@uname_old[8] != $icq) || (@uname_old[12] != $about) || (@uname_old[14] != $interes) || (@uname_old[15] != $citata))
# 				{
# 					print $photo;
# 					#FIXME: тут должнен быть запрос на изменение пароля!!
# 					#$re = mysql_query("UPDATE reg SET name='$nic_cook' WHERE id='$uname_auth'", $dbcnx);
# 					$re = $dbcnx_via->do(qq{UPDATE users SET username='$nic' WHERE username='$uname_old_nic'});
# 					if (!$re) {die("База Данных временно не работает (error #9)")};
# 					
# 					$re = $dbcnx->do(qq{UPDATE username SET name='$name', nic='$nic', email='$mail', bday='$bday', sex='$sex', phone='$phone', icq='$icq', last_time='$date', interes='$interes', citata='$citata', about='$about' WHERE id='$uname_auth'});
# 					if (!$re) {die("База Данных временно не работает (error #10)")};
# 					
# 					#TODO: записывать в vCard аватар!!
# 					$re = $dbcnx_via->do(qq{UPDATE vcard SET username='$nic', vcard='$vcard'  WHERE username='$uname_old_nic'});
# 				
# 					if (!$re) {die("База Данных временно не работает (error #11)")};
# 					
# 					#TODO: Доделать запись логов а именно скакой на какую информацию произошло изменение
# 					log_write($date.': Пользователь "'.$nic.'" обновил свою информацию email: '.$mail.', имя: '.$name.', телефон:'.$phone.', пол:'.$sex.' (IP: '.$ENV{'REMOTE_ADDR'}.' Agent: '.$ENV{'HTTP_USER_AGENT'}).')';
# 					
# 					$ath->finish();
# 					$re->finish();
# 					$dbcnx->disconnect();
# 					return 1;
# 				}
# 				else
# 				{
# 					$ath->finish();
# 					$re->finish();
# 					$dbcnx->disconnect();
# 					return 0;
# 				}
# 			}
# 		
# 	if (!$re) {die("hi (error #12)")};
# 	$re->finish();
# 	$dbcnx->disconnect();
# 	}
# 	else
# 	{
# 		$re->finish();
# 		$dbcnx->disconnect();
# 		
# 		return FALSE;
# 	}
# }

sub show_user_groups_ids
{
	#FIXME: ТУТ ВАЩЕ ХУЙНЯ С ФУНКЦИЕЙ ПЕРЕПИСАТЬ!!!!!!!!!!!!!!!!
	
	#my $arr = $dbcnx->selectrow_array("select groups from username WHERE id = $id") or die("hi (error #13)");
	
	$re = $dbcnx->prepare(qq{select groups from username WHERE id=?});
	$re->execute($_[0]) or die("hi (error #13)");
	$results = $re->fetchrow_array();
	$re->finish();
	$dbcnx->disconnect();
	#print
	return $results;
}

sub show_user_groups_names
{
	my $uname_id = shift;
	my $arr = shift;
	$re = $dbcnx->prepare(qq{SELECT id,nazvanie FROM groups WHERE id IN($arr)});
	$re->execute() or die("hi (error #14)");;
	print qq{\n};
 	while ( ($id, $nazvanie) = $re->fetchrow_array() ) {
 		print qq{\t\t\t\t\t\t<item title="$nazvanie" href="/groups/index.pl?uname=$uname_id&amp;gr&#61;$id" />\n};
 	}
	
	### Вообщето правельнее так делать
	
# 	for($x=0; $x<5; $x++) {
# 		($id, $nazvanie) = $re->fetchrow_array();
# 		print qq{\t\t\t\t\t\t<item name="$nazvanie" href="/groups/index.pl?uname=$uname_id&amp;gr&#61;$id" />\n};
# 	}
	$re->finish();
	$dbcnx->disconnect();
	return @arr;
}



sub show_user_music_names
{
	#my $uname_id = shift;
	#
	#	Выводить случайно выбранные элементы
	#
	$re = $dbcnx->prepare(qq{SELECT id,title,artist FROM music WHERE users_id=?});
	$re->execute($_[0]) or die("hi (error #14)");;
	print qq{\n};

	$x = 0;
	while ( ($id,,$title, $artist) = $re->fetchrow_array() ) {
		if($x != 5)
		{
			print qq{\t\t\t\t\t\t<item id="$id" title="$title&#160;-&#160;$artist" href="/music/index.pl?uname=$_[0]" />\n};
			$x++;
		}
		else
		{
			print qq{\t\t\t\t\t\t<more-music user_id="$_[0]"/>};
			$re->finish();
			return @arr;
		}
 	}
	
	$re->finish();
	$dbcnx->disconnect();
	return @arr;
}

sub show_user_video_names
{
	#my $uname_id = shift;
	#
	#	Выводить случайно выбранные элементы
	#
	$re = $dbcnx->prepare(qq{SELECT id,title,ganre FROM video WHERE users_id=?});
	$re->execute($_[0]) or die("hi (error #14)");;
	print qq{\n};

	$x = 0;
	while ( ($id,$title, $ganre) = $re->fetchrow_array() ) {
		if($x != 5)
		{
			print qq{\t\t\t\t\t\t<item id="$id" title="$title&#160;-&#160;$ganre" href="/video/index.pl?uname=$_[0]&amp;video_id&#61;$id&amp;act=play" />\n};
			$x++;
		}
		else
		{
			print qq{\t\t\t\t\t\t<more-video user_id="$_[0]"/>};
			#print qq{\t\t\t\t\t\t<no-video text="У пользователя пока не добавленна видео"/>};
			$re->finish();
			return @arr;
		}
 	}
	
	$re->finish();
	$dbcnx->disconnect();
	return @arr;
}

sub group_info
{
	#my $id = shift;
	#---0-----1----------2-----------------3---------------------4--------------5-------------------6------7------------8---------------9------------10
	#+----+----------+-------+--------------------------------+----------+---------------------+-------+------+---------------------+-------------+--------+
	#| id | autor_id | autor | nazvanie                       | sostav   | time                | about | rod  | next_meet           | obsuzhdenie | visits |
	#+----+----------+-------+--------------------------------+----------+---------------------+-------+------+---------------------+-------------+--------+
	#|  1 |     NULL | sos   | sos`s group                    | 121 2 12 | 0000-00-00 00:00:00 | 0     | 0    | 0000-00-00 00:00:00 | 0           |      0 | 
	#+----+----------+-------+--------------------------------+----------+---------------------+-------+------+---------------------+-------------+--------+
	$re = $dbcnx->prepare(qq{SELECT * FROM groups WHERE id=?});
	$re->execute($_[0]) or die("hi (error #14)");
	
	@results = $re->fetchrow_array();
	$re->finish();
	$dbcnx->disconnect();
	return @results;
}


sub do_check_str($str)
{
	#echo iconv_strlen($str)."<br>";
	
	$str = str_replace(';', '\;', $str);
	$str = str_replace("'", "\'", $str);
	$str = str_replace('"', '\"', $str);
	return $str;
}

sub do_print_menu
{
print qq{<menu>
	    <object>
		<name>username</name>
		<href>/username/index.pl?uname=$auth_id</href>
	    </object>
	    <object>
		<name>Проекты</name>
		<href>/groups/index.pl?uname=$auth_id</href>
	    </object>
	    <object>
		<name>Литература</name>
		<href>/litera/index.php?uname=$auth_id</href>
	    </object>
	    <object>
		<name>Кино</name>
		<href>/video/index.pl?uname=$auth_id</href>
	    </object>
	    <object>
		<name>Музыка</name>
		<href>/music/index.pl?uname=$auth_id</href>
	    </object>
	    <object>
		<name>Искуство</name>
		<href>/picture/index.php?uname=$auth_id</href>
	    </object>
	    <object>
		<name>Соль</name>
		<href></href>
	    </object>
    </menu>};
}


sub print_comments
{
	my $cat = shift;
	my $item_id = shift;
	
	$re = $dbcnx->prepare(qq{SELECT * FROM comments WHERE cat=? AND item_id=?});
	$re->execute($cat,$item_id) or die("hi (error #14)");
	print qq{\n};

	while ( ($id,$autor,$time,$cat,$item_id,$title,$comment,$level,$state) = $re->fetchrow_array() ) 
	{
		if($state == 0)
		{
			my $nic = get_nic($autor);
			print qq{\t\t\t\t\t\t<item id="$id" autor="$autor" time="$time" nic="$nic" cat="$cat" item_id="$item_id" title="$title" comment="$comment" level="$level" />\n};
		}
 	}
	
	$re->finish();
	$dbcnx->disconnect();
	return @arr;
}

sub convert_bugzilla_type
{
	@type_text = ("", "Регистрация", "Вход на сайт", "Анкета пользователя", "Литература", "Кино", "Музыка", "Фотоальбом", "Другое...");
	
	return @type_text[$_[0]];
}

# $t1 = gettimeofday; 
# $elapsed = $t1 - $start_time; 
# print "$elapsed\n";
if (!dbh) # Если дескриптор равен 0 соединение не установлено
{print"<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно. (site)</P>";}
1;
